# from flasgger import Swagger
from flask import Flask, render_template, request, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

# 1.初始化 Flask 应用实例
app = Flask(__name__)
app.secret_key = 'test'
# 初始化 swagger 应用实例
# swagger = Swagger(app)

'''
2.配置数据库连接(如果没有配置数据库创建文件地址，
    系统会自动帮助创建一个 instance 的文件夹，并且在下面创建一个你自定义的数据库文件)
'''
# db_path = os.path.join(os.path.dirname(__file__), 'data.db')  # 获取当前文件所在目录
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///data.db'  # 数据库文件路径
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁用修改跟踪（可选）

# 3.初始化 SQLAlchemy 应用实例
db = SQLAlchemy(app)


# 4.定义数据库模型
class User(db.Model):  # 表名将会是 user（自动生成，小写处理）
    user_id = db.Column(db.Integer, primary_key=True)  # 主键
    username = db.Column(db.String(20))  # 名字


class Movie(db.Model):  # 表名将会是 movie
    movie_id = db.Column(db.Integer, primary_key=True)  # 主键
    movie_title = db.Column(db.String(60))  # 电影标题
    movie_year = db.Column(db.String(4))  # 电影年份


# 5.调用 db.py 生成 instance/data.db 数据库并且插入数据

# 6. 定义路由和视图函数
@app.route('/', redirect_to='/upload')
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        # 检查是否有文件在请求中
        if 'file' not in request.files:
            return redirect(request.url)

    # 渲染上传文件的HTML页面
    return render_template('upload.html')


@app.route('/index', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':  # 判断是否是 POST 请求
        # 获取表单数据
        movie_title = request.form.get('title')  # 传入表单对应输入字段的 username 值
        movie_year = request.form.get('year')
        print(movie_title, movie_year)

        # 验证数据
        if not movie_title or not movie_year or len(movie_year) > 4 or len(movie_title) > 60:
            flash('Invalid input.')  # 显示错误提示
            return redirect(url_for('index'))  # 重定向回主页
        # 保存表单数据到数据库
        movie = Movie(movie_title=movie_title, movie_year=movie_year)  # 创建记录
        # 添加到数据库会话
        db.session.add(movie)
        # 提交数据库会话
        db.session.commit()
        # 显示成功创建的提示
        flash('Item created.')
        # 重定向回主页
        return redirect(url_for('index'))

    movies_list = Movie.query.all()
    return render_template('index.html', moviesList=movies_list)


@app.route('/movie/edit/<int:movie_id>', methods=['GET', 'POST'])
def edit(movie_id):
    movie = Movie.query.get_or_404(movie_id)

    if request.method == 'POST':  # 处理编辑表单的提交请求
        movie_title = request.form['movie_title']
        movie_year = request.form['movie_year']

        if not movie_title or not movie_year or len(movie_year) != 4 or len(movie_title) > 60:
            flash('Invalid input.')
            return redirect(url_for('edit', movie=movie_id))  # 重定向回对应的编辑页面

        movie.movie_title = movie_title  # 更新标题
        movie.movie_year = movie_year  # 更新年份

        db.session.commit()  # 提交数据库会话

        flash('Item updated.')
        return redirect(url_for('index'))  # 重定向回主页

    return render_template('edit.html', movie=movie)  # 传入被编辑的电影记录


@app.route('/movie/delete/<int:movie_id>', methods=['POST'])
def delete(movie_id):
    movie = Movie.query.get_or_404(movie_id)  # 获取电影记录
    db.session.delete(movie)  # 删除对应的记录
    db.session.commit()  # 提交数据库会话
    flash('Item deleted.')
    return redirect(url_for('index'))  # 重定向回主页


# 上下文处理器
@app.context_processor
def inject_user():
    users = User.query.first()
    return dict(users=users)


# 在找不到 url 路由地址时候，自动载入 404 模板
@app.errorhandler(404)
def page_not_found():
    return render_template('error/404.html'), 404


# 7. 运行应用（仅在脚本直接执行时生效）
if __name__ == '__main__':
    app.run(debug=True)  # 开启调试模式（生产环境应设为 False）
